import numpy as np

def demonstrate_numpy_arithmetic_functions():
    """
    NumPy算术函数演示脚本
    包含菜鸟教程链接中的所有算术函数知识点
    """
    
    print("=== NumPy算术函数演示 ===\n")
    
    # 1. 基本算术运算函数
    print("1. 基本算术运算函数 - add(), subtract(), multiply(), divide()")
    print("=" * 60)
    
    # 创建测试数组
    print("创建第一个数组 (3x3):")
    a = np.arange(9, dtype=np.float_).reshape(3, 3)
    print(f"a = \n{a}")
    
    print("\n创建第二个数组 (1x3):")
    b = np.array([10, 10, 10])
    print(f"b = {b}")
    
    # 加法运算
    print("\n加法运算:")
    result_add = np.add(a, b)
    print(f"np.add(a, b) = \n{result_add}")
    print("说明: 数组a的每一行都与数组b进行逐元素相加")
    
    # 减法运算
    print("\n减法运算:")
    result_subtract = np.subtract(a, b)
    print(f"np.subtract(a, b) = \n{result_subtract}")
    print("说明: 数组a的每一行都与数组b进行逐元素相减")
    
    # 乘法运算
    print("\n乘法运算:")
    result_multiply = np.multiply(a, b)
    print(f"np.multiply(a, b) = \n{result_multiply}")
    print("说明: 数组a的每一行都与数组b进行逐元素相乘")
    
    # 除法运算
    print("\n除法运算:")
    result_divide = np.divide(a, b)
    print(f"np.divide(a, b) = \n{result_divide}")
    print("说明: 数组a的每一行都与数组b进行逐元素相除")
    
    # 2. numpy.reciprocal() - 倒数函数
    print("\n2. reciprocal() - 倒数函数")
    print("=" * 60)
    
    reciprocal_array = np.array([0.25, 1.33, 1, 100])
    print(f"测试数组: {reciprocal_array}")
    
    result_reciprocal = np.reciprocal(reciprocal_array)
    print(f"np.reciprocal(array) = {result_reciprocal}")
    print("说明: 返回数组中每个元素的倒数")
    print("验证: 0.25的倒数是4, 1.33的倒数是约0.75, 1的倒数是1, 100的倒数是0.01")
    
    # 3. numpy.power() - 幂函数
    print("\n3. power() - 幂函数")
    print("=" * 60)
    
    # 单次幂运算
    power_array1 = np.array([10, 100, 1000])
    print(f"测试数组: {power_array1}")
    
    result_power1 = np.power(power_array1, 2)
    print(f"np.power(array, 2) = {result_power1}")
    print("说明: 对数组中每个元素计算平方")
    
    # 不同指数的幂运算
    power_array2 = np.array([1, 2, 3])
    print(f"\n指数数组: {power_array2}")
    
    result_power2 = np.power(power_array1, power_array2)
    print(f"np.power(base_array, exponent_array) = {result_power2}")
    print("说明: 第一个数组作为底数，第二个数组作为指数，进行逐元素幂运算")
    print("验证: 10^1=10, 100^2=10000, 1000^3=1000000000")
    
    # 4. numpy.mod() 和 numpy.remainder() - 取模函数
    print("\n4. mod() 和 remainder() - 取模函数")
    print("=" * 60)
    
    mod_array1 = np.array([10, 20, 30])
    mod_array2 = np.array([3, 5, 7])
    
    print(f"被除数数组: {mod_array1}")
    print(f"除数数组: {mod_array2}")
    
    # mod() 函数
    result_mod = np.mod(mod_array1, mod_array2)
    print(f"np.mod(a, b) = {result_mod}")
    
    # remainder() 函数
    result_remainder = np.remainder(mod_array1, mod_array2)
    print(f"np.remainder(a, b) = {result_remainder}")
    
    print("说明: mod() 和 remainder() 函数功能相同，都返回相除后的余数")
    print("验证: 10÷3=3余1, 20÷5=4余0, 30÷7=4余2")
    
    # 5. 补充：其他算术运算
    print("\n5. 其他算术运算补充")
    print("=" * 60)
    
    # 负号运算
    print("负号运算:")
    test_neg = np.array([1, -2, 3, -4])
    print(f"原数组: {test_neg}")
    print(f"np.negative(array) = {np.negative(test_neg)}")
    
    # 绝对值运算
    print("\n绝对值运算:")
    print(f"np.abs(array) = {np.abs(test_neg)}")
    
    # 平方根运算
    print("\n平方根运算:")
    sqrt_array = np.array([4, 9, 16, 25])
    print(f"测试数组: {sqrt_array}")
    print(f"np.sqrt(array) = {np.sqrt(sqrt_array)}")
    
    # 6. 数组广播机制演示
    print("\n6. 数组广播机制演示")
    print("=" * 60)
    
    # 不同形状数组的运算
    print("不同形状数组的算术运算:")
    
    # 3x3 数组
    array_2d = np.array([[1, 2, 3], 
                         [4, 5, 6], 
                         [7, 8, 9]])
    
    # 1x3 数组（行向量）
    row_vector = np.array([10, 20, 30])
    
    # 3x1 数组（列向量）
    col_vector = np.array([[10], [20], [30]])
    
    print(f"二维数组:\n{array_2d}")
    print(f"行向量: {row_vector}")
    print(f"列向量:\n{col_vector}")
    
    print("\n二维数组 + 行向量:")
    print(f"结果:\n{np.add(array_2d, row_vector)}")
    print("说明: 行向量被广播到每一行")
    
    print("\n二维数组 + 列向量:")
    print(f"结果:\n{np.add(array_2d, col_vector)}")
    print("说明: 列向量被广播到每一列")
    
    print("\n=== 演示结束 ===")

def demonstrate_arithmetic_edge_cases():
    """
    演示算术函数的边界情况
    """
    print("\n" + "="*60)
    print("算术函数边界情况演示")
    print("="*60)
    
    # 除零情况
    print("1. 除零情况处理:")
    zero_test = np.array([1, 2, 0, 4])
    print(f"数组: {zero_test}")
    
    try:
        result = np.divide(10, zero_test)
        print(f"10 / array = {result}")
    except Exception as e:
        print(f"错误: {e}")
    
    # 使用np.where处理除零
    print("\n使用np.where安全处理除零:")
    safe_result = np.where(zero_test != 0, 10 / zero_test, 0)
    print(f"安全除法结果: {safe_result}")
    
    # 大数运算
    print("\n2. 大数运算:")
    big_numbers = np.array([1e10, 1e20, 1e30])
    print(f"大数数组: {big_numbers}")
    print(f"平方: {np.power(big_numbers, 2)}")
    
    # 复数运算
    print("\n3. 复数运算:")
    complex_array = np.array([1+2j, 3+4j, 5+6j])
    print(f"复数数组: {complex_array}")
    print(f"共轭复数: {np.conjugate(complex_array)}")
    print(f"实部: {np.real(complex_array)}")
    print(f"虚部: {np.imag(complex_array)}")

if __name__ == "__main__":
    demonstrate_numpy_arithmetic_functions()
    demonstrate_arithmetic_edge_cases()